package com.stu.day09;

/**
 * 枚举的值是固定的，不可更改
 * 默认继承 java.lang.Enum 类
 * 可以有构造方法、成员变量和方法,可以实现接口但不能继承类,不能被继承（final 类）
 * 可以使用 values() 方法遍历所有枚举值
 * valueOf(String name) 方法用于将字符串转换为枚举对象
 * ordinal() 方法返回枚举值的索引（从 0 开始）
 * enum 是单例模式，每个枚举值是唯一的,Color.RED == Color.RED 始终返回 true
 * @author zy
 * @date 2025/1/31 16:33
 */
public class EnumDemo {
    public static void main(String[] args) {

        for (Color c : Color.values()) {
            System.out.print(c+"\t");
        }
        System.out.println(Color.BLUE);  // BLUE
        System.out.println(Color2.BLUE);  // com.stu.day09.Color2@3d075dc0
        System.out.println(Color4.BLUE);  // BLUE

        Color c = Color.valueOf("RED");  // 如果传入不是有效枚举对象,会报IllegalArgumentException
        System.out.println(c); // 输出: RED

        Color3 c3 = Color3.RED;
        System.out.println(c3.getDescription()); // 输出: Red Color
        System.out.println(c3);

    }
}
enum Color {
    RED, GREEN, BLUE;  // 因为是公开静态常量,所以直接打印三个"构造方法"
    Color(){
        System.out.println("构造方法");
    }
}
/*
如果要用普通类实现类似 enum 的功能，我们需要：

私有构造方法，防止外部创建新实例。
静态常量，确保唯一性。
重写 toString() 方法，返回名称。
提供 values() 和 valueOf() 方法，模拟 enum 的行为。
但这个实现有缺陷，比如不能使用 switch，也不能继承 Enum 的方法。所以 使用 enum 是更好的选择。
 */
class Color2 {  // 简单模拟枚举类型
    public static final Color2 RED = new Color2();
    public static final Color2 GREEN = new Color2();
    public static final Color2 BLUE = new Color2();
}
class Color4 {  // 模拟枚举类型
    public static final Color4 RED = new Color4("RED");
    public static final Color4 GREEN = new Color4("GREEN");
    public static final Color4 BLUE = new Color4("BLUE");

    private String name; // 存储枚举名

    private Color4(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name; // 让 toString() 返回枚举名
    }

    // 模拟 values() 方法
    public static Color4[] values() {
        return new Color4[]{RED, GREEN, BLUE};
    }

    // 模拟 valueOf() 方法
    public static Color4 valueOf(String name) {
        for (Color4 c : values()) {
            if (c.name.equals(name)) {
                return c;
            }
        }
        throw new IllegalArgumentException("No enum constant Color." + name);
    }
}

enum Color3 {
    RED("Red Color"),
    GREEN("Green Color"),
    BLUE("Blue Color");

    private String description; // 描述信息

    // 构造方法
    private Color3(String description) {
        this.description = description;
    }

    // 获取描述
    public String getDescription() {
        return description;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Color3{");
        sb.append("description='").append(description).append('\'');
        sb.append('}');
        return sb.toString();
    }
}
